amd-iommu: obtain page_alloc_lock before traversing a domain's page list
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 30 Jan 2009 11:13:06 +0000 (11:13 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 30 Jan 2009 11:13:06 +0000 (11:13 +0000)
From all I can tell, this doesn't violate lock ordering as other
places call heap allocation functions from inside hd->mapping_lock.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/drivers/passthrough/amd/iommu_map.c

index 32d0389dbd1d2be407ab47a7bb478ed461655413..0009d72699aacb869515da1bc843812815f8d7ce 100644 (file)
@@ -567,6 +567,8 @@ int amd_iommu_sync_p2m(struct domain *d)
     if ( hd->p2m_synchronized )
         goto out;
 
+    spin_lock(&d->page_alloc_lock);
+
     page_list_for_each ( page, &d->page_list )
     {
         mfn = page_to_mfn(page);
@@ -579,6 +581,7 @@ int amd_iommu_sync_p2m(struct domain *d)
 
         if ( iommu_l2e == 0 )
         {
+            spin_unlock(&d->page_alloc_lock);
             amd_iov_error("Invalid IO pagetable entry gfn = %lx\n", gfn);
             spin_unlock_irqrestore(&hd->mapping_lock, flags);
             return -EFAULT;
@@ -587,6 +590,8 @@ int amd_iommu_sync_p2m(struct domain *d)
         set_iommu_l1e_present(iommu_l2e, gfn, (u64)mfn << PAGE_SHIFT, iw, ir);
     }
 
+    spin_unlock(&d->page_alloc_lock);
+
     hd->p2m_synchronized = 1;
 
 out: